this.appInfo = appInfo;
this.id = appInfo.get_id();
this.isRemoteProvider = true;
-
- this._cancellable = new Gio.Cancellable();
},
createIcon: function(size, meta) {
return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber));
},
- _getResultsFinished: function(results, error) {
+ _getResultsFinished: function(results, error, callback) {
if (error) {
if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
- } else {
- this.searchSystem.setResults(this, results[0]);
+ callback([]);
+ return;
}
+
+ callback(results[0]);
},
- getInitialResultSet: function(terms) {
- this._cancellable.cancel();
- this._cancellable.reset();
+ getInitialResultSet: function(terms, callback, cancellable) {
this.proxy.GetInitialResultSetRemote(terms,
- Lang.bind(this, this._getResultsFinished),
- this._cancellable);
+ Lang.bind(this, this._getResultsFinished, callback),
+ cancellable);
},
- getSubsearchResultSet: function(previousResults, newTerms) {
- this._cancellable.cancel();
- this._cancellable.reset();
+ getSubsearchResultSet: function(previousResults, newTerms, cancellable) {
this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
- Lang.bind(this, this._getResultsFinished),
- this._cancellable);
+ Lang.bind(this, this._getResultsFinished, callback),
+ cancellable);
},
_getResultMetasFinished: function(results, error, callback) {
callback(resultMetas);
},
- getResultMetas: function(ids, callback) {
- this._cancellable.cancel();
- this._cancellable.reset();
+ getResultMetas: function(ids, callback, cancellable) {
this.proxy.GetResultMetasRemote(ids,
Lang.bind(this, this._getResultMetasFinished, callback),
- this._cancellable);
+ cancellable);
},
activateResult: function(id) {
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
this._reloadRemoteProviders();
+
+ this._cancellable = new Gio.Cancellable();
},
addProvider: function(provider) {
},
_registerProvider: function (provider) {
- provider.searchSystem = this;
this._providers.push(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
- provider.searchSystem = null;
},
getProviders: function() {
},
getTerms: function() {
- return this._previousTerms;
+ return this._terms;
},
reset: function() {
- this._previousTerms = [];
- this._previousResults = [];
+ this._terms = [];
+ this._results = {};
},
- setResults: function(provider, results) {
- let i = this._providers.indexOf(provider);
- if (i == -1)
- return;
-
- this._previousResults[i] = [provider, results];
- this.emit('search-updated', this._previousResults[i]);
+ _gotResults: function(results, provider) {
+ this._results[provider.id] = results;
+ this.emit('search-updated', provider, results);
},
setTerms: function(terms) {
+ this._cancellable.cancel();
+ this._cancellable.reset();
+
+ let previousResults = this._results;
+ let previousTerms = this._terms;
+ this.reset();
+
if (!terms)
return;
let searchString = terms.join(' ');
- let previousSearchString = this._previousTerms.join(' ');
+ let previousSearchString = previousTerms.join(' ');
if (searchString == previousSearchString)
return;
let isSubSearch = false;
- if (this._previousTerms.length > 0)
+ if (previousTerms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
- let previousResultsArr = this._previousResults;
-
- let results = [];
- this._previousTerms = terms;
- this._previousResults = results;
+ this._terms = terms;
if (isSubSearch) {
- for (let i = 0; i < this._providers.length; i++) {
- let [provider, previousResults] = previousResultsArr[i];
- results.push([provider, []]);
- provider.getSubsearchResultSet(previousResults, terms);
- }
+ this._providers.forEach(Lang.bind(this, function(provider) {
+ let previousResults = previousResults[provider.id];
+ provider.getSubsearchResultSet(previousResults, terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
+ }));
} else {
- for (let i = 0; i < this._providers.length; i++) {
- let provider = this._providers[i];
- results.push([provider, []]);
- provider.getInitialResultSet(terms);
- }
+ this._providers.forEach(Lang.bind(this, function(provider) {
+ provider.getInitialResultSet(terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
+ }));
}
}
});
this.actor.add(separator.actor);
this._resultDisplays = {};
+
+ this._cancellable = new Gio.Cancellable();
},
destroy: function() {
if (metasNeeded.length === 0) {
callback();
} else {
+ this._cancellable.cancel();
+ this._cancellable.reset();
+
this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) {
metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
let meta = metas[i];
this._resultDisplays[resultId] = display;
}));
callback();
- }));
+ }), this._cancellable);
}
},
}
},
- _updateResults: function(searchSystem, results) {
+ _updateResults: function(searchSystem, provider, results) {
let terms = searchSystem.getTerms();
- let [provider, providerResults] = results;
let display = provider.display;
- display.updateSearch(providerResults, terms, Lang.bind(this, function() {
+ display.updateSearch(results, terms, Lang.bind(this, function() {
this._maybeSetInitialSelection();
this._updateStatusText();
}));